package main

import "github.com/gin-gonic/gin"

/*
1. must bind
不用，校验失败修改状态码

shoud bind
可以绑定json query parm yaml xml
*/

type UserInfo struct {
	Name string `json:"name" form:"name"`
	Age  int    `json:"age" form:"age"`
	Sex  string `json:"sex" form:"sex"`
}

func main() {

	eng := gin.Default()
	eng.POST("/postJson", postJson)
	eng.GET("/getJson", getJson)
	eng.POST("/upload", uploadFile)
	eng.Run(":8080")
}

//127.0.0.1:8080/postJson
// req:
// {
//     "name": "damon",
//     "age": 23,
//     "sex": "man"
// }
// Resp:
// {
//     "user": {
//         "name": "damon",
//         "age": 23,
//         "sex": "man"
//     }
// }

// {
//     "name": "damon",
//     "age": "233",
//     "sex": "man"
// }

// {
//     "err": "json: cannot unmarshal string into Go struct field UserInfo.age of type int",
//     "msg": "参数错误"
// }

func postJson(c *gin.Context) {
	var u UserInfo
	err := c.ShouldBindJSON(&u)
	if err != nil {
		c.JSON(400, gin.H{
			"msg": "参数错误",
			"err": err.Error(),
		})
		return
	}
	c.JSON(200, gin.H{
		"user": u,
	})
}

// 127.0.0.1:8080/getJson?name=Damon&age=29&sex=man
// Resp
//
//	{
//	    "user": {
//	        "name": "Damon",
//	        "age": 29,
//	        "sex": "man"
//	    }
//	}
func getJson(c *gin.Context) {

	var u UserInfo
	err := c.ShouldBindQuery(&u)
	if err != nil {
		c.JSON(400, gin.H{
			"msg": "参数错误",
			"err": err.Error(),
		})
		return
	}
	c.JSON(200, gin.H{
		"user": u,
	})
}

// 处理文件上传
func uploadFile(c *gin.Context) {
	// 获取上传的文件
	file, err := c.FormFile("file")
	if err != nil {
		c.JSON(400, gin.H{
			"msg": "文件上传失败",
			"err": err.Error(),
		})
		return
	}

	// 保存文件到本地
	dst := "./" + file.Filename
	err = c.SaveUploadedFile(file, dst)
	if err != nil {
		c.JSON(400, gin.H{
			"msg": "文件保存失败",
			"err": err.Error(),
		})
		return
	}

	c.JSON(200, gin.H{
		"msg":      "文件上传成功",
		"filename": file.Filename,
	})
}
